package com.company.java.basic.day04;

import java.util.Scanner;

/*
数组（Array）
相同数据类型的元素，按一定顺序排列的集合
数组名：score
支持索引，和length
数组内存分配
java程序运行在JVM中，在JVM内存中两块区域比较重要，堆和栈
栈用来存储局部变量（现在见到的都是局部变量）
堆用来存储对象。
在数组score初始化时score = new int[2]，就是将一个int[]对象赋给了变量
类型为int[]的变量，在栈内的变量score内存储的是int[]对象的首地址；
因为数组元素是有序排列，new会申请一整块内存来存储数据；
所以数组元素得寻址方式是元素地址=int[]对象首地址+偏移量；
因此元素索引是从0开始。
 */
public class Day04_Array {
    public static void main(String[] args) {
        // 初识数组
        /*
        //声明数组
        int[] score ;
        //静态初始化
        score = new int[2];//初始化（确定长度和值）
        score[0] = 1;
        score[1] = 3;
        int[] height = new int[]{};
        int[] weight = {};
        System.out.println(score);//返回值为数据类型+@+对象的hashcode编码值
        System.out.println(score[0]);
        System.out.println(score.length);
        //遍历数组
        for (int i=0;i<score.length;i++){
            System.out.println(score[i]);
        }

         */

        // 动态初始化（给出长度）
        /*
        int[] son = new int[5];
        //给出长度后，数组就会有默认值
        // byte short int long 为0
        //float double 0.0
        // char None，String null,boolean false
        for (int i=0;i<=son.length-1;i++){
            System.out.println(son[i]);
        }
        //用for存储5个连续的学号
        for (int i=0;i<=son.length-1;i++){
            son[i] = 1000+i;
        }
        for (int i=0;i<=son.length-1;i++){
            System.out.println(son[i]);
        }
        //用for存储5个英文字母
        char[] letter = new char[5];
        for (int i=0;i<=letter.length-1;i++){
            letter[i] = (char)(i+'A');
        }
        for (int i=0;i<=letter.length-1;i++){
            System.out.println(letter[i]);
        }

         */

        // 创建数组存储26英文字母，打印a->A
        /*
        //创建数组
        char[] litter = new char[26];
        //维数组赋值
        for (int i=0;i<litter.length;i++){
            litter[i] = (char)('a'+i);
        }
        //打印数组，大写比小写字母打32，所以减32
        for (int i=0;i<litter.length;i++){
            System.out.println(litter[i]+"->"+(char)(litter[i]-32));
        }

         */

        // 求数组中最值,和其索引值，并考虑重复问题
        /*
        //建立数组并赋值
        int[] number = {10,5,22,33,1,7,4,33,1};
        //创建比较变量
        int maxIndex = 0;
        int minIndex = 0;
        //for循环进行比较找出最值
        for (int i=1;i<number.length;i++){
            if (number[i]>number[maxIndex])maxIndex=i;
            if (number[minIndex]>number[i])minIndex=i;
        }
        //处理重复
        System.out.println("最大值"+number[maxIndex]+"下标如下");
        for (int i=1;i<number.length;i++){
            if (number[i]==number[maxIndex])
                System.out.print(i+" ");
        }
        System.out.println("最小值"+number[minIndex]+"下标如下");
        for (int i=1;i<number.length;i++) {
            if (number[i] == number[minIndex])
                System.out.print(i + " ");
        }

         */

        // 数组的平均值，和反转
        /*
        //平均值
        int[] number = {10,5,22,33,1,7,4,33,1};
        int sum = 0;
        for (int i=0;i<number.length;i++){
            sum += number[i];
        }
        System.out.println("平均值："+((float)sum/number.length));
        // 反转
        int[] aNumber = {1,2,3,4,5,6,7,8};
        int[] bNumber = new int[8];
        //法一，首尾交换，注意交换的次数aNumber.length/2
        for (int i=0,j=aNumber.length-1-i;i<aNumber.length/2;i++){
            aNumber[i] = aNumber[i]+aNumber[j];
            aNumber[j] = aNumber[i]-aNumber[j];
            aNumber[i] = aNumber[i]-aNumber[j];
        }
        aNumber = bNumber;
        for (int i=0;i<aNumber.length;i++){
            System.out.print(aNumber[i]);
        }

         */

        //数组的复制，从键盘输入新数组的长度
        /*
        //输入长度
        Scanner input = new Scanner(System.in);
        System.out.print("输入一个整数：");
        int len = input.nextInt();
        int[] arr = {1,2,3,4,5};
        int[] newArr = new int[len];
        //拷贝时，注意遍历的次数
        for (int i=0;i<arr.length && i<newArr.length;i++){
            newArr[i] = arr[i];
        }
        for (int i=0;i<newArr.length;i++){
            System.out.println(newArr[i]);
        }

         */

        //截取数组
        /*
        //创建数组
        int[] arr = {1,2,3,4,5,6};
        //确定截取的范围(按索引截取)
        int start = 2;
        int end = 4;
        //创建新数组,长度为end-start+1
        int[] newArr = new int[end-start+1];
        //拷贝相应的元素,注意拷贝旧数组的索引
        for (int i=0;i<newArr.length;i++){
             newArr[i] = arr[i+start];
        }
        for (int i=0;i<newArr.length;i++){
            System.out.println(newArr[i]);
        }

         */

    }
}
